import pandas as pd
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import re
from typing import List, Dict
from config import (
    STOP_WORDS,
    FONT_PATH,
    WORD_CLOUD_WIDTH,
    WORD_CLOUD_HEIGHT,
    WORD_CLOUD_BACKGROUND,
    WORD_CLOUD_MAX_WORDS,
    MIN_DANMAKU_LENGTH
)

def filter_danmaku(danmaku_list: List[str]) -> List[str]:
    """过滤无意义的弹幕
    
    过滤规则：
    1. 去重：完全相同的弹幕只保留一个
    2. 长度过滤：过短的弹幕会被删除
    3. 内容过滤：
        - 纯数字
        - 重复字符（如666666、hhhhh）
        - 过多标点符号
        - 表情符号
    4. 内容规范：
        - 删除多余空格
        - 删除特殊字符
    """
    filtered = []
    seen = set()  # 用于去重
    
    # 更多的噪声模式
    noise_patterns = [
        # 重复字符
        r'^(.)\1{2,}$',  # 任意字符重复3次以上
        r'^[6️⃣6\s]{3,}$',  # 666
        r'^[。.]{2,}$',  # 省略号
        r'^[哈嘻呵啊]{2,}$',  # 笑声
        r'^[？！?!]{2,}$',  # 多个标点
        
        # 常见无意义短语
        r'^[草艹操日奈]{1,2}$',  # 常见感叹词
        r'^[牛🐮]{1,2}$',  # 夸赞
        r'^[简直绝了]*$',
        
        # 表情符号
        r'[\U0001F300-\U0001F9FF]',  # Unicode 表情
        r'[\U00002600-\U000026FF]',  # 杂项符号
        
        # 数字相关
        r'^\d+$',  # 纯数字
        r'^第[0-9一二三四五六七八九十百千万亿]+[集章节个]?$',  # 第x集
    ]
    
    for dm in danmaku_list:
        # 基础清理
        dm = dm.strip()
        if not dm:
            continue
            
        # 去重
        if dm in seen:
            continue
        seen.add(dm)
        
        # 长度过滤
        if len(dm) < MIN_DANMAKU_LENGTH:
            continue
            
        # 模式过滤
        is_noise = False
        for pattern in noise_patterns:
            if re.search(pattern, dm, re.UNICODE):
                is_noise = True
                break
                
        if not is_noise:
            # 清理多余空格
            dm = re.sub(r'\s+', ' ', dm)
            # 清理特殊字符
            dm = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9\s，。？！、]', '', dm)
            
            if len(dm) >= MIN_DANMAKU_LENGTH:
                filtered.append(dm)
    
    return filtered

def save_to_excel(data: List[Dict], filename: str, sheet_name: str) -> None:
    """保存数据到Excel
    
    Args:
        data: 要保存的数据列表
        filename: 保存的文件名
        sheet_name: Excel工作表名称
    """
    df = pd.DataFrame(data)
    df.to_excel(filename, sheet_name=sheet_name, index=False)
    
def generate_word_cloud(danmaku_list: List[str], filename: str) -> None:
    """生成词云图
    
    Args:
        danmaku_list: 弹幕文本列表
        filename: 保存的文件名
    """
    # 分词并过滤停用词
    words = []
    for d in danmaku_list:
        words.extend(
            word for word in jieba.cut(d)
            if word not in STOP_WORDS and len(word) > 1
        )
    text = ' '.join(words)
    
    # 配置词云
    wordcloud = WordCloud(
        font_path=FONT_PATH,
        width=WORD_CLOUD_WIDTH,
        height=WORD_CLOUD_HEIGHT,
        background_color=WORD_CLOUD_BACKGROUND,
        max_words=WORD_CLOUD_MAX_WORDS,
    )
    
    # 生成词云
    wordcloud.generate(text)
    
    # 保存图片
    plt.figure(figsize=(WORD_CLOUD_WIDTH/100, WORD_CLOUD_HEIGHT/100))
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis('off')
    plt.savefig(filename, bbox_inches='tight', pad_inches=0)
    plt.close()